# ========================
#       Импорт Модулей
# ========================

# Мы уже неоднократно пользовались внешними функциями из подключаемых модулей, теперь подробнее...

# Чтобы пользоваться дополнительными функциями и классами, можно импортировать модули
import math
import sys
import os

# sqrt() - это функция для вычисления кв.корня, которая находится в модуле math
print(math.sqrt(4))

# Другой вариант подключения модуля
from math import sqrt
# Из модуля math мы подключили только функцию sqrt()
# Она доступна без math. , напрямую
print(sqrt(4))

# Импортируем несколько функций сразу
from math import sqrt, sin, cos
print(sin(0.2))

# Можно импортировать все содержимое модуля
from math import *
# Это плохой подход, т.к. имена функций модуля, модут конфликтовать с именами вашего
# Или других подключенных (импортированных) модулей.
print(cos(0.4))  # не совсем понятно из какого модуля данная функция, особенно если подключено много модулей
# Удобство import math - заключается в том, что вы создаете пространство имен math,
# и избегаете конфликтов (при одинаковых именах функций и классов в различных модулях)

# Пространства имен:
# Например в module1 есть функция do_this() и в module2 есть функция do_this
# Пишем:
# import module1
# import module2
# Используем одноименные, но разные функции из разных модулей:
# module1.do_this()
# module2.do_this()

# Зачем нужны модули?
# Для логического разбиения программы на части для:
# 1. Повторного использования программного кода
# 2. Разделения пространств имен (см. пример выше)
# 3. Реализация служб или данных для совместного использования